package top.linyuxb.lycloud.config.starter.utils;

import lombok.extern.slf4j.Slf4j;

/**
 * Created by Intellij IDEA.
 *
 * @Author: linyuxb
 * @Date: 2024/6/13 17:41
 * @Desc: 字符串转类型工具
 */
@Slf4j
public class StringToTypeConverterUtil {
    /**
     * @param clazz
     * @param value
     * @return
     */
    public static Object convertStringToType(Class<?> clazz, String value) {
        // 处理基本类型和String
        if (clazz.isPrimitive() || clazz.equals(String.class)) {
            // 基本类型和String不需要实例化，直接返回值即可
            return convertToPrimitiveOrString(clazz, value);
        }
        // 对于非基本类型，使用构造函数创建实例
        Object o = null;
        try {
            o = clazz.getConstructor(String.class).newInstance(value);
        } catch (Exception e) {
            log.error("StringToTypeConverterUtil convertStringToType error", e);
        }
        return o;
    }

    /**
     * 原始类型转换器
     *
     * @param type
     * @param value
     * @return
     */
    private static Object convertToPrimitiveOrString(Class<?> type, String value) {
        if (type.equals(int.class)) {
            return Integer.parseInt(value);
        } else if (type.equals(double.class)) {
            return Double.parseDouble(value);
        } else if (type.equals(boolean.class)) {
            return Boolean.parseBoolean(value);
        } else if (type.equals(long.class)) {
            return Long.parseLong(value);
        } else if (type.equals(float.class)) {
            return Float.parseFloat(value);
        } else if (type.equals(byte.class)) {
            return Byte.parseByte(value);
        } else if (type.equals(short.class)) {
            return Short.parseShort(value);
        } else if (type.equals(char.class)) {
            if (value.length() != 1) {
                throw new IllegalArgumentException("Character string must have length 1");
            }
            return value.charAt(0);
        }
        // 对于String类型，直接返回原值
        return value;
    }
}
